#pragma once
#ifndef X3_H
#define X3_H

#include <vector>
using ll = long long;

// 计算元素全排列的亦或运算优化：通过计算每一位的二进制01亦或关系
// ∵ 确定0 或者 1 的时候只需要确定另一个元素是1或者 0 就可以++
// ∴ 01成对匹配就得出了 0 * 1(个数)就可以知道匹配对有多少
// 然后乘以当前位权值：2^(i - 1)
// 最后得出 0 * 1 * 2^(i - 1)就是当前位异或得出的值 ※※※
// UP6 = ^
ll up6(std::vector<ll> vec)
{
    ll an[32] = {0L};
    ll ans = 0L;
    for (ll i = 1; i <= vec.size(); i++)
    {
        int j = 1;
        while (vec[i])
        {
            an[j] += vec[i] & 1;
            j++;
            vec[i] >>= 1;
        }
    }
    for (ll i = 1; i <= 30; i++)
    {
        ans += an[i] * (vec.size() - an[i]) * (1 << i - 1);
    }
    return ans;
}

#endif